namespace SmartMedicalRAG.Core.Models;

/// <summary>
/// 分诊建议模型 - 定义智能分诊系统的核心输出结果
/// 作用：提供基于 AI 分析的智能分诊建议，包含科室推荐、优先级、推理过程等
/// 包含：推荐科室、分诊优先级、推理过程、置信度、追溯来源等
/// 用途：为医生提供智能化的分诊决策支持
/// 
/// 示例：
/// {
///   "id": "12345678-1234-1234-1234-123456789abc",
///   "recommendedDepartment": "神经内科",
///   "priority": "Urgent",
///   "reasoning": "患者出现头痛、恶心、呕吐等症状，伴有发热，需要排除颅内感染",
///   "guidelineReferences": ["头痛诊断指南", "脑膜炎临床路径"],
///   "similarCaseIds": ["2024001", "2024002"],
///   "realTimeDataSources": ["生命体征监测", "症状评估"],
///   "confidence": 0.85,
///   "generatedAt": "2024-01-15T10:30:00Z"
/// }
/// </summary>
public class TriageRecommendation
{
    /// <summary>
    /// 建议唯一标识符 - 自动生成的 GUID
    /// 作用：唯一标识每个分诊建议记录
    /// 格式：标准 GUID 字符串
    /// 示例："12345678-1234-1234-1234-123456789abc"
    /// </summary>
    public string Id { get; set; } = Guid.NewGuid().ToString();
    
    /// <summary>
    /// 推荐科室 - AI 推荐的诊疗科室
    /// 作用：基于患者症状和体征，推荐最适合的诊疗科室
    /// 内容：具体的科室名称
    /// 示例："神经内科"、"心内科"、"急诊科"、"普外科"
    /// 用途：指导患者到正确的科室就诊
    /// </summary>
    public string RecommendedDepartment { get; set; } = string.Empty;
    
    /// <summary>
    /// 分诊优先级 - 患者就诊的紧急程度
    /// 作用：评估患者病情的紧急程度，确定就诊优先级
    /// 可能值：Emergency（急诊）、Urgent（紧急）、Routine（常规）、NonUrgent（非紧急）
    /// 用途：帮助医院合理安排就诊顺序，确保危重患者优先得到救治
    /// </summary>
    public TriagePriority Priority { get; set; }
    
    /// <summary>
    /// 推理过程 - AI 分析推理的详细过程
    /// 作用：解释 AI 如何得出分诊建议，增强透明度和可解释性
    /// 内容：症状分析、体征评估、风险评估、科室匹配等推理过程
    /// 示例："患者出现头痛、恶心、呕吐等症状，伴有发热，需要排除颅内感染"
    /// 用途：帮助医生理解 AI 的决策逻辑，增强信任度
    /// </summary>
    public string Reasoning { get; set; } = string.Empty;
    
    /// <summary>
    /// 指南引用 - 支持建议的临床指南
    /// 作用：提供支持分诊建议的临床指南和标准
    /// 内容：相关的临床指南、诊疗规范、专家共识等
    /// 示例：["头痛诊断指南", "脑膜炎临床路径", "急诊分诊标准"]
    /// 用途：为分诊建议提供权威的医学依据
    /// </summary>
    public List<string> GuidelineReferences { get; set; } = new();
    
    /// <summary>
    /// 相似病例ID - 数据库中相似的病例记录
    /// 作用：提供相似病例的参考，支持基于案例的推理
    /// 内容：数据库中相似病例的唯一标识符
    /// 示例：["2024001", "2024002", "2024003"]
    /// 用途：为医生提供相似病例的处理经验和参考
    /// </summary>
    public List<string> SimilarCaseIds { get; set; } = new();
    
    /// <summary>
    /// 实时数据来源 - 支持建议的实时数据
    /// 作用：标识支持分诊建议的实时数据来源
    /// 内容：生命体征监测、症状评估、检查结果等实时数据
    /// 示例：["生命体征监测", "症状评估", "心电图监测", "血氧监测"]
    /// 用途：确保建议基于最新的患者数据
    /// </summary>
    public List<string> RealTimeDataSources { get; set; } = new();
    
    /// <summary>
    /// 置信度 - 建议的可靠程度
    /// 作用：量化分诊建议的可靠程度
    /// 范围：0.0-1.0（0% 到 100%）
    /// 示例：0.85 表示 85% 的置信度
    /// 用途：帮助医生评估 AI 建议的可信度
    /// </summary>
    public float Confidence { get; set; }
    
    /// <summary>
    /// 生成时间 - 建议生成的时间戳
    /// 作用：记录分诊建议生成的时间，用于数据管理和审计
    /// 格式：UTC 时间戳
    /// 示例："2024-01-15T10:30:00Z"
    /// </summary>
    public DateTime GeneratedAt { get; set; } = DateTime.UtcNow;
}

/// <summary>
/// 分诊优先级枚举 - 定义患者就诊的紧急程度等级
/// 作用：标准化分诊优先级的分类，确保分诊的一致性
/// 包含：急诊、紧急、常规、非紧急四个等级
/// 用途：指导医院合理安排就诊顺序，优化医疗资源配置
/// </summary>
public enum TriagePriority
{
    /// <summary>
    /// 急诊 - 需要立即救治的危重患者
    /// 作用：标识需要立即救治的危重患者
    /// 特点：生命体征不稳定，存在生命危险
    /// 示例：心脏骤停、严重创伤、急性心肌梗死
    /// 处理：立即进入抢救流程，优先救治
    /// </summary>
    Emergency,
    
    /// <summary>
    /// 紧急 - 需要及时救治的急症患者
    /// 作用：标识需要及时救治的急症患者
    /// 特点：病情较重，需要及时处理
    /// 示例：急性腹痛、高热、呼吸困难
    /// 处理：优先安排就诊，及时处理
    /// </summary>
    Urgent,
    
    /// <summary>
    /// 常规 - 可以按常规流程处理的患者
    /// 作用：标识可以按常规流程处理的患者
    /// 特点：病情相对稳定，可以等待
    /// 示例：慢性病复查、轻微外伤、一般体检
    /// 处理：按常规流程安排就诊
    /// </summary>
    Routine,
    
    /// <summary>
    /// 非紧急 - 可以延迟处理的轻微症状患者
    /// 作用：标识可以延迟处理的轻微症状患者
    /// 特点：症状轻微，不影响生命安全
    /// 示例：轻微感冒、皮肤瘙痒、一般咨询
    /// 处理：可以适当延迟，避免占用急诊资源
    /// </summary>
    NonUrgent
}

/// <summary>
/// 检索结果模型 - 定义知识检索的结果数据
/// 作用：存储从知识库中检索到的相关信息
/// 包含：检索类型、结果列表、召回率、覆盖率等
/// 用途：为 RAG 系统提供知识检索的详细结果
/// 
/// 示例：
/// {
///   "type": "Hybrid",
///   "results": ["相关医学文献", "临床指南", "相似病例"],
///   "recallRate": 0.92,
///   "coverage": 0.85,
///   "responseTime": "2024-01-15T10:30:00Z",
///   "reasoningPath": "检索路径详情"
/// }
/// </summary>
public class RetrievalResult
{
    /// <summary>
    /// 检索类型 - 使用的检索方法
    /// 作用：标识使用的检索方法类型
    /// 可能值：Semantic（语义检索）、Hybrid（混合检索）、MultiHop（多跳检索）
    /// 用途：了解检索策略，优化检索效果
    /// </summary>
    public RetrievalType Type { get; set; }
    
    /// <summary>
    /// 检索结果 - 从知识库检索到的内容
    /// 作用：存储检索到的相关知识和信息
    /// 内容：医学文献、临床指南、相似病例等
    /// 示例：["相关医学文献", "临床指南", "相似病例", "专家共识"]
    /// 用途：为 AI 生成提供知识支持
    /// </summary>
    public List<object> Results { get; set; } = new();
    
    /// <summary>
    /// 召回率 - 检索结果的完整性
    /// 作用：评估检索结果的完整性
    /// 范围：0.0-1.0（0% 到 100%）
    /// 示例：0.92 表示 92% 的相关内容被检索到
    /// 用途：评估检索质量，优化检索策略
    /// </summary>
    public float RecallRate { get; set; }
    
    /// <summary>
    /// 覆盖率 - 知识库的覆盖程度
    /// 作用：评估检索对知识库的覆盖程度
    /// 范围：0.0-1.0（0% 到 100%）
    /// 示例：0.85 表示检索覆盖了 85% 的相关知识
    /// 用途：评估知识库的完整性和检索的全面性
    /// </summary>
    public float Coverage { get; set; }
    
    /// <summary>
    /// 响应时间 - 检索完成的时间
    /// 作用：记录检索完成的时间，用于性能监控
    /// 格式：UTC 时间戳
    /// 示例："2024-01-15T10:30:00Z"
    /// </summary>
    public DateTime ResponseTime { get; set; }
    
    /// <summary>
    /// 推理路径 - 检索的推理过程
    /// 作用：记录检索的推理路径和过程
    /// 内容：检索策略、查询扩展、结果排序等推理过程
    /// 用途：增强检索过程的可解释性和透明度
    /// </summary>
    public object? ReasoningPath { get; set; }
}

/// <summary>
/// 检索类型枚举 - 定义不同的知识检索方法
/// 作用：标识不同的检索策略和方法
/// 包含：语义检索、混合检索、多跳检索三种类型
/// 用途：根据查询需求选择合适的检索方法
/// </summary>
public enum RetrievalType
{
    /// <summary>
    /// 语义检索 - 基于语义相似度的检索
    /// 作用：基于语义相似度进行知识检索
    /// 特点：理解查询的语义含义，找到语义相关的内容
    /// 适用：自然语言查询、概念匹配
    /// </summary>
    Semantic,
    
    /// <summary>
    /// 混合检索 - 结合多种检索方法的检索
    /// 作用：结合语义检索和关键词检索等多种方法
    /// 特点：综合多种检索策略，提高检索效果
    /// 适用：复杂查询、多维度检索需求
    /// </summary>
    Hybrid,
    
    /// <summary>
    /// 多跳检索 - 基于知识图谱的多跳推理检索
    /// 作用：基于知识图谱进行多跳推理检索
    /// 特点：通过实体关系进行多步推理
    /// 适用：复杂推理、关系挖掘
    /// </summary>
    MultiHop
}

/// <summary>
/// 知识更新模型 - 定义知识库更新的数据格式
/// 作用：标准化知识库更新的数据结构
/// 包含：向量数据、关键词数据、图谱数据等
/// 用途：支持知识库的动态更新和维护
/// 
/// 示例：
/// {
///   "vectorData": "向量化知识数据",
///   "keywordData": "关键词索引数据",
///   "graphData": "知识图谱数据",
///   "updateTime": "2024-01-15T10:30:00Z"
/// }
/// </summary>
public class KnowledgeUpdate
{
    /// <summary>
    /// 向量数据 - 知识库的向量化数据
    /// 作用：存储知识库的向量化表示
    /// 内容：文本、图像、语音等数据的向量表示
    /// 用途：支持语义检索和相似性计算
    /// </summary>
    public object? VectorData { get; set; }
    
    /// <summary>
    /// 关键词数据 - 知识库的关键词索引
    /// 作用：存储知识库的关键词索引数据
    /// 内容：关键词、术语、实体等索引信息
    /// 用途：支持关键词检索和精确匹配
    /// </summary>
    public object? KeywordData { get; set; }
    
    /// <summary>
    /// 图谱数据 - 知识图谱数据
    /// 作用：存储知识图谱的结构化数据
    /// 内容：实体、关系、属性等图谱信息
    /// 用途：支持关系推理和多跳检索
    /// </summary>
    public object? GraphData { get; set; }
    
    /// <summary>
    /// 更新时间 - 知识库更新的时间戳
    /// 作用：记录知识库更新的时间
    /// 格式：UTC 时间戳
    /// 示例："2024-01-15T10:30:00Z"
    /// </summary>
    public DateTime UpdateTime { get; set; }
}

/// <summary>
/// 搜索结果模型 - 定义搜索操作的返回结果
/// 作用：标准化搜索结果的格式
/// 包含：查询内容、结果列表、时间戳等
/// 用途：为搜索功能提供统一的返回格式
/// 
/// 示例：
/// {
///   "query": "头痛症状",
///   "results": ["相关医学文献", "临床指南", "专家共识"],
///   "timestamp": "2024-01-15T10:30:00Z"
/// }
/// </summary>
public class SearchResult
{
    /// <summary>
    /// 查询内容 - 用户的搜索查询
    /// 作用：记录用户的搜索查询内容
    /// 内容：用户输入的搜索关键词或查询语句
    /// 示例："头痛症状"、"急性腹痛"、"发热处理"
    /// 用途：记录搜索历史，优化搜索体验
    /// </summary>
    public string Query { get; set; } = string.Empty;
    
    /// <summary>
    /// 结果列表 - 搜索返回的结果
    /// 作用：存储搜索返回的相关结果
    /// 内容：相关的医学文献、临床指南、专家共识等
    /// 示例：["相关医学文献", "临床指南", "专家共识", "相似病例"]
    /// 用途：为用户提供相关的知识和信息
    /// </summary>
    public List<object> Results { get; set; } = new();
    
    /// <summary>
    /// 时间戳 - 搜索执行的时间
    /// 作用：记录搜索执行的时间
    /// 格式：UTC 时间戳
    /// 示例："2024-01-15T10:30:00Z"
    /// </summary>
    public DateTime Timestamp { get; set; }
} 